Rem ****************************************
Rem * Shell3a external command - du.opl
Rem * ¸ Nick Murray May 1996
Rem *
Rem * du - Display the usage of a filesystem
Rem *     by directory
Rem ****************************************
PROC du%:(n%)
LOCAL i%,buf$(128),ret%,flag%,tot&
	ONERR ErrTrap::
	i%=2
	WHILE i%<=n%
		buf$=PEEK$(argv%(i%))
		IF buf$="-s"
			flag%=1
		ELSE
			BREAK
		ENDIF
		i%=i%+1
	ENDWH
	SHesc%=0
	IF i%>n%	Rem no directories given
		buf$=SHcwd$
	ENDIF
	DO
		ret%=Fparse%:(ADDR(buf$),buf$)
		IF ret%<0
			PRINT PrPath$:(buf$),"-",err$:(ret%)
			RETURN
		ELSEIF ret% AND 16
			tot&=SHdu&:(buf$,flag%)
			IF flag%
				fprint%:(NUM$(tot&,-9)+" "+PrPath$:(buf$))
			ENDIF
		ENDIF
		IF SHesc% OR  KEY=27
			GIPRINT ERR$(-114)
			SHesc%=1
			BREAK
		ENDIF
		i%=i%+1
		IF i%<=n%
			buf$=PEEK$(argv%(i%))
		ENDIF
	UNTIL i%>n%
	RETURN
ErrTrap::
	ONERR off
	PRINT err$:(ERR)
ENDP

PROC SHdu&:(d$,flag%)
LOCAL Fformat%,Fattr%,Fsize&,Mtime&,Spare&
LOCAL i$(128),in$(128),size%(8),h%,ret%,tot&
	ret%=IOOPEN(h%,d$,$0030)
	IF ret%<0
		RAISE ret%
	ENDIF
	WHILE (IOW(h%,1,#(UADD(ADDR(i$),1)),size%()) >=0)
		POKEB ADDR(i$),CALL($B9,0,0,0,0,UADD(ADDR(i$),1))
		IF i$="." OR i$=".."	Rem ignore . and .. on UNIX filesystems
			CONTINUE
		ENDIF
		IF KEY=27
			SHesc%=1
			GOTO End::
		ENDIF
		i$=d$+i$
		in$=i$+CHR$(0)
		CALL($0887,UADD(ADDR(in$),1),ADDR(Fformat%),0,0,0)
		IF (Fattr% AND $10)	Rem directory
Rem if this was done properly we'd call Fparse% to get the actual
Rem  directory component separator (it's not always '\'!). This
Rem  however is SLOW, so assume a backslash.
			tot&=tot&+SHdu&:(i$+"\",flag%)
			IF SHesc%
				GOTO End::
			ENDIF
			CONTINUE
		ELSE
			tot&=tot&+Fsize&
		ENDIF
	ENDWH
	IF flag%=0
		fprint%:(NUM$(tot&,-9)+" "+PrPath$:(d$))
	ENDIF
End::
	IOCLOSE(h%)
	RETURN tot&
ErrTrap::
	ONERR off
	IOCLOSE(h%)
	PRINT err$:(ERR)
ENDP
